package edu.nf.ch07.container;


import java.lang.reflect.Field;

/**
 * @author CSY
 * @date 2025 - 04 - 16
 * 属性注入处理器
 */
public class FieldInjectHandler {
    /**
     * 属性注入
     */
    public void handle(Object instance, ContainerFactory factory) {
        //遍历当前对象的所有私有属性，检查是否定义了Inject注解
        for (Field field : instance.getClass().getDeclaredFields()) {

            if (field.isAnnotationPresent(Inject.class)) {
                //获取注解的value属性(也就是需要注入的对象的名称)
                String name = field.getAnnotation(Inject.class).value();
                //从容器中取出这个的对象并注入到当前的instance实例中
                Object injectObj = factory.getBean(name);
                //赋值到Field字段中
                setValue(field,instance , injectObj);
            }
        }

    }

    /**
     * 注入
     * @param field 需要注入的字段
     * @param instance 被注入的对象
     * @param inject 注入的实例
     */
    private void setValue(Field field, Object instance,Object inject) {
        try {
            //如果不能访问
            if (!field.canAccess(instance)){
                //打开访问
                field.setAccessible(true);
            }
            field.set(instance,inject);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}
